/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ecom.shell;

import ecom.ejb.CustomerRemote;
import ecom.ejb.EuroConverterRemote;
import ecom.ejb.EuroConverterRemote.Devise;
import ecom.entity.AccountRemote;
import ecom.entity.CommandeRemote;
import ecom.entity.ProductRemote;

import exceptions.AccountException;
import exceptions.CartException;
import exceptions.IdentifiantInvalide;

import exceptions.InstanceInvalide;
import java.io.IOException;
import java.io.PrintStream;
import java.util.regex.Pattern;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import shell.command.ShellCommandImpl;
import shell.command.ShellContext;

/**
 *
 * @author François
 */
public class CartCommandImpl extends ShellCommandImpl {
    /**
     * Constructeur.
     */
    public CartCommandImpl(final ShellContext context) {
	super(context);
    }

    @Override
    public String getName() {
	return "cart";
    }

    @Override
    public String getUsage() {
	return "cart [ -add|-remove <int> ] | [ -buy <string> ]";
    }
    
    @Override
    public String getShortDescription() {
	return "Manage cart";
    }

    @Override
    public void execute(final String ligneDeCommande, final PrintStream out,
	    final PrintStream err) {
	// Commande d'ajout
	Pattern patternAdd = Pattern.compile("^-add\\s\\d+$");
	// Commande de retrait
	Pattern patternRemove = Pattern.compile("^-remove\\s\\d+$");
	// Commande d'achat
	Pattern patternBuy = Pattern.compile("^-buy\\s\\w+$");

	Document dom = null;
	Element root = null;
	StringBuilder texte = null;
	boolean erreur = false;

	if (this.getContexte().getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		.equals(EcomShellConstantes.TEXT_MIMETYPE)) {
	    /*
	     * Si TEXTE
	     */
	    texte = new StringBuilder();
	} else if (this.getContexte()
		.getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		.equals(EcomShellConstantes.XML_MIMETYPE)) {
	    /*
	     * Si XML
	     */
	    try {
		dom = Output.getNewDocument();
		root = dom.createElement(this.getName() + "Command");
		dom.appendChild(root);
	    } catch (final ParserConfigurationException e) {
		err.println(e.getMessage());
	    }
	}

	/*
	 * Aucun argument -> Contenu
	 */
	if (ligneDeCommande.trim().equals("")) {
	    out.println("Affichage du contenu du caddie");

	    /*
	     * Gestion de la sortie
	     */
	    if (this.getContexte()
		    .getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		    .equals(EcomShellConstantes.TEXT_MIMETYPE)) {
		/*
		 * Si TEXTE
		 */
		texte.append(Output.toStringCaddie(
			(CustomerRemote) this.getContexte().getVar(
				EcomShellConstantes.CUSTOMER),
			(Devise) this.getContexte().getVar(
				EcomShellConstantes.CURRENT_CURRENCY),
			(EuroConverterRemote) this.getContexte().getVar(
				EcomShellConstantes.CONVERTER)));
	    } else if (this.getContexte()
		    .getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		    .equals(EcomShellConstantes.XML_MIMETYPE)) {
		/*
		 * Si XML
		 */
		root.appendChild(Output.toXmlCaddie(
			(CustomerRemote) this.getContexte().getVar(
				"customer"),
			dom,
			(Devise) this.getContexte().getVar(
				EcomShellConstantes.CURRENT_CURRENCY),
			(EuroConverterRemote) this.getContexte().getVar(
				EcomShellConstantes.CONVERTER)));
	    }
	} else if (patternAdd.matcher(ligneDeCommande).find()) {
	    /*
	     * Récupération de l'identifiant du produit
	     */
	    Long idProduit = Long.parseLong(ligneDeCommande
		    .replace("-add ", ""));
	    out.println("Ajout de l'article : " + idProduit);

	    /*
	     * Récupération du produit
	     */
	    try {
		ProductRemote produit = ((CustomerRemote) this
			.getContexte().getVar(EcomShellConstantes.CUSTOMER))
			.getProduct(idProduit);

		if (produit != null) {
		    ((CustomerRemote) this.getContexte().getVar(
			    EcomShellConstantes.CUSTOMER)).addProduitCart(
			    produit, 1);
		} else {
		    err.println("Le produit n'existe pas");
		}
	    } catch (final IdentifiantInvalide e) {
		err.println(e.getMessage());
	    } catch (final CartException e) {
		err.println(e.getMessage());
	    }
	} else if (patternRemove.matcher(ligneDeCommande).find()) {
	    /*
	     * Récupération de l'identifiant du produit
	     */
	    Long idProduit = Long.parseLong(ligneDeCommande.replace("-remove ",
		    ""));
	    out.println("Retrait de l'article : " + idProduit);

	    /*
	     * Récupération du produit
	     */
	    try {
		ProductRemote produit = ((CustomerRemote) this
			.getContexte().getVar(EcomShellConstantes.CUSTOMER))
			.getProduct(idProduit);

		if (produit != null) {
		    ((CustomerRemote) this.getContexte().getVar(
			    EcomShellConstantes.CUSTOMER)).removeProduitCart(
			    produit, 1);
		} else {
		    err.println("Le produit n'existe pas");
		}
	    } catch (final IdentifiantInvalide e) {
		err.println(e.getMessage());
	    } catch (final CartException e) {
		err.println(e.getMessage());
	    }
	} else if (patternBuy.matcher(ligneDeCommande).find()) {
	    /*
	     * Récupération de l'identifiant du produit
	     */
	    String idCompte = ligneDeCommande.replace("-buy ", "");
	    out.println("Achat du caddie ave cle compte : " + idCompte);

	    try {
		AccountRemote compte = ((CustomerRemote) this.getContexte()
			.getVar(EcomShellConstantes.CUSTOMER))
			.getAccount(idCompte);

		if (compte != null) {
		    CommandeRemote comm = ((CustomerRemote) this.getContexte().getVar(
			    EcomShellConstantes.CUSTOMER)).buyCart(compte);
                    
                    if (comm != null) {
                        ((CustomerRemote) this.getContexte().getVar(
			    EcomShellConstantes.CUSTOMER)).confirmCommande(comm);
                    }
		} else {
		    err.println("Le compte n'existe pas");
		}
	    } catch (final IdentifiantInvalide e) {
		err.println(e.getMessage());
	    } catch (final InstanceInvalide e) {
		err.println(e.getMessage());
	    } catch (final CartException e) {
		err.println(e.getMessage());
	    } catch (final AccountException e) {
		err.println(e.getMessage());
	    }
	} else {
	    out.println("Usage: " + this.getUsage());
	    erreur = true;
	}

	if (!erreur) {
	    if (this.getContexte()
		    .getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		    .equals(EcomShellConstantes.TEXT_MIMETYPE)) {
		/*
		 * Si TEXTE
		 */
		out.println(texte.toString());
	    } else if (this.getContexte()
		    .getVar(EcomShellConstantes.OUTPUT_MIME_FORMAT)
		    .equals(EcomShellConstantes.XML_MIMETYPE)) {
		try {
		    out.println(Output.toString(dom));
		} catch (final IOException e) {
		    err.println(e.getMessage());
		}
	    }
	}
    }
}
